﻿// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
// 
// Copyright (c) 2012, Dr. Masroor Ehsan
// All rights reserved.
// 
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//    * Redistributions of source code must retain the above copyright
//      notice, this list of conditions and the following disclaimer.
//    * Redistributions in binary form must reproduce the above copyright
//      notice, this list of conditions and the following disclaimer in the
//      documentation and/or other materials provided with the distribution.
//    * Neither the name of the <organization> nor the
//      names of its contributors may be used to endorse or promote products
//      derived from this software without specific prior written permission.
// 
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// 
// $Id: TestResultCodeLinks.cs 12 2012-01-27 06:11:46Z masroore@gmail.com $
// 
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;

namespace LWObjects
{
    public class TestResultCodeLinks : List<TestResultCodeLink>, IAlaSerializable
    {
        #region IAlaSerializable Members

        public string Serialize()
        {
            var sb = new StringBuilder();
            foreach (var link in this)
            {
                if (sb.Length > 0)
                    sb.Append(Utilities.ALA_MULTI_SEPARATOR);
                sb.Append(link.Serialize());
            }
            return sb.ToString();
        }

        public void Deserialize(string data)
        {
            Clear();
            var parts = Utilities.ParseTestResultLinks(data);
            foreach (var part in parts)
            {
                var link = new TestResultCodeLink();
                link.Deserialize(part);
                if (link.Result != null)
                    Add(link);
            }
        }

        public void Reset()
        {
            Clear();
        }

        #endregion

        public int MoveUp(TestResultCodeLink link)
        {
            var oldIndex = IndexOf(link);
            if (oldIndex == 0)
                return 0;
            var newIndex = oldIndex - 1;
            MoveItem(oldIndex, newIndex);
            return newIndex;
        }

        public int MoveDown(TestResultCodeLink link)
        {
            var oldIndex = IndexOf(link);
            if (oldIndex == Count - 1)
                return 0;
            var newIndex = oldIndex + 1;
            MoveItem(oldIndex, newIndex);
            return newIndex;
        }

        private void MoveItem(int oldIndex, int newIndex)
        {
            var aux = this[newIndex];
            this[newIndex] = this[oldIndex];
            this[oldIndex] = aux;
        }

        public void CalcItemIndexes()
        {
            var index = 1;
            foreach (var item in this)
            {
                item.PrintSequence = index.ToString(CultureInfo.InvariantCulture);
                index++;
            }
        }

        public bool Exists(string code)
        {
            return this.Any(link => string.Compare(link.Result.Code, code, true) == 0);
        }
    }
}